#include "locallistwidget.h"
#include "ui_locallistwidget.h"
#include "localfolderdialog.h"
#include <QDebug>
#include <QTimer>

LocalListWidget::LocalListWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::LocalListWidget)
{
    ui->setupUi(this);

    QVBoxLayout *containerLayout = static_cast<QVBoxLayout*>(ui->container->layout());
    containerLayout->setAlignment(Qt::AlignTop);       // 布局内所有子控件顶对齐
    containerLayout->setContentsMargins(60, 0, 57, 0);    // 左边距60, 右边距 60-3

    // ban掉可能出现的横向滑动条
    ui->scrollArea->setWidgetResizable(true);
    ui->scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); // 永久关掉横向
    //viewport():获取滚动区域内部实际显示内容的部分
    //installEventFilter(this):所有发送到视口的事件都会先经过当前对象的 eventFilter 函数
    ui->scrollArea->viewport()->installEventFilter(this); // 添加事件过滤器来处理滚动区域大小变化

    QString htmlText = "<span style='font-family:Microsoft YaHei; font-size:33px; font-weight:bold; color: rgb(40, 50, 72);'>本地音乐</span>  "
                       "<span style='font-family:Microsoft YaHei; font-size:18px; font-weight:300 ; color:#9ca3af;'>共 " + QString::number(_songItems.size()) +" 首</span>";
    ui->label_listName->setText(htmlText);
    ui->label_listName->setTextFormat(Qt::RichText);  // 确保是富文本模式

//    _selectedPaths << "D:/CloudMusic";
}

LocalListWidget::~LocalListWidget()
{
    delete ui;
}

void LocalListWidget::flush()
{
    ui->pushButton_download->clicked();
}

#include <QResizeEvent>
// 添加事件过滤器函数以处理container窗体大小自适应变化
bool LocalListWidget::eventFilter(QObject *watched, QEvent *event)
{
    if (!ui->scrollArea || !ui->scrollArea->viewport()) {
        qDebug() << "Scroll area or viewport is null!";
        return false;
    }
    if (watched == ui->scrollArea->viewport() && event->type() == QEvent::Resize) {
        // 当窗口大小变化时调整container的最小宽度
        QResizeEvent *resizeEvent = (QResizeEvent*)(event);
        int newWidth = resizeEvent->size().width();
        ui->container->setMinimumWidth(newWidth);
    }

    return QWidget::eventFilter(watched, event);
}

//本地音乐的添加歌曲项函数
void LocalListWidget::addSongItem(SongItemWidget *songItem)
{
    _songItems.push_back(songItem);
    songItem->setIndex(_songItems.size());
    connect(songItem, &SongItemWidget::played, this, &LocalListWidget::on_songItem_played);
    songItem->connectManager(); //链接歌曲管理器，实现歌曲播放、喜欢、下载等状态的自动同步和响应。
    ui->container->layout()->addWidget(songItem);
}

void LocalListWidget::on_songItem_played(int index, bool play)
{
    emit played(_songItems[index]->songItem(), play);
}

void LocalListWidget::on_pushButton_playAll_clicked()
{
    QVector<QUrl> songs;
    for(auto& e : _songItems){
        songs.push_back(e->songItem().url());
    }
    emit playAll(songs);
}

void LocalListWidget::on_pushButton_clicked()
{
    LocalFolderDialog dialog(this);
    //初始化对话框中的路径列表
    dialog.initPaths(_selectedPaths);
    if(dialog.exec() == QDialog::Accepted){
        _selectedPaths = dialog.getPaths();
        //扫描本地音乐并加载
        ui->pushButton_download->clicked();
    }
    qDebug() << "选择的文件夹为:";
    for(auto& path : _selectedPaths){
        qDebug() << path;
    }
    qDebug() << "-------------";
}

#include <QMimeDatabase>
#include <QMimeType>
//判断给定路径的文件是否是音频文件
bool isMedia(const QString& path){
    QMimeDatabase db;
    // 获取文件的 MIME 类型
    QMimeType type = db.mimeTypeForFile(path);
    //获取 MIME 类型的名称，例如 "audio/mpeg" 或 "video/mp4"。
    return type.name().startsWith("audio/");
}

#include <QDir>
#include <QMediaPlayer>
#include <QMimeData>
#include <QMediaMetaData>
#include "songitem.h"
#include "songmanager.h"
//扫描本地音乐并加载
void LocalListWidget::on_pushButton_download_clicked()
{
    //先清空当前所有歌曲项和UI控件。
    for(int i = 0; i < _songItems.size(); i++){
        ui->container->layout()->removeWidget(_songItems[i]);
        delete _songItems[i];
    }
    _songItems.clear();

    qDebug() << "刷新:";
    QVector<QDir> dirs(_selectedPaths.begin(), _selectedPaths.end());
    for(auto& dir : dirs){
        //获取当前dir目录中的歌曲文件和子目录名字组成的list列表
        QStringList paths = dir.entryList();
        for(auto& path : paths){
            qDebug() << path;
            if (isMedia(path)){
                // 获取文件的绝对路径
                path = dir.absoluteFilePath(path);
                qDebug() << "找到音频文件 : " << path;
                SongItem song;
                //将本地文件系统中的路径转换为 URL 格式
                song.local_url = QUrl::fromLocalFile(path);
                qDebug() << "song.local_url : " << song.local_url;
                //对每个音频文件，尝试从SongManager获取SongItem，
                //如果没有则用QMediaPlayer读取元数据（如歌名、专辑、歌手、封面、时长）。
                if (SongManager::instance()->getSongItem(&song))
                {
                }
                else
                {
                    QMediaPlayer player(this);
                    //指定媒体文件的路径。
                    player.setSource(song.local_url);
                    //检查元数据是否可用
                    while(!player.metaData().keys().contains(QMediaMetaData::Title))
                    {
                        //在执行长时间运行的操作时，如果不调用 processEvents()，界面可能会冻结，用户无法进行任何操作。
                        //通过定期调用 processEvents()，可以确保界面保持响应状态，用户可以继续与应用程序交互。
                        QCoreApplication::processEvents();
                    }
//                    QStringList keys = player.availableMetaData();
//                    for (const QString &key : keys) {
//                        qDebug() << key << ":" << player.metaData(key);
//                    }
                    song.duration = player.duration();
//                    if(song.duration == 0) continue;
                    QStringList artists = player.metaData().value(QMediaMetaData::Author).toStringList();
                    song.name = player.metaData().value(QMediaMetaData::Title).toString();
                    song.album = player.metaData().value(QMediaMetaData::AlbumTitle).toString();
                    for(int i = 0; i < artists.size(); i++) {
                        if(i) song.artist += " / ";
                        song.artist += artists[i];
                    }
                    QImage thumbnailImage = player.metaData().value(QMediaMetaData::ThumbnailImage).value<QImage>();
                    if (!thumbnailImage.isNull()) {
                        song.image = QPixmap::fromImage(thumbnailImage);
                    } else {
                        QByteArray imageData = player.metaData().value(QMediaMetaData::CoverArtImage).toByteArray();
                        if (!imageData.isEmpty()) {
                            song.image.loadFromData(imageData);
                        } else {
                            qDebug() << "No cover art available";
                        }
                    }
                    SongManager::instance()->addSongItem(song);
                }
                SongItemWidget* songIW = new SongItemWidget(this);
                //设置图片大小为0，是为了让本地音乐列表的歌曲项不显示专辑封面图片，使界面更紧凑、简洁。
                songIW->setImageSize(0);
                songIW->setSongItem(song);
                //使用定时器延迟0毫秒调用 addSongItem(songIW)，即把这个控件添加到界面布局中。
                //这样做可以避免在UI刷新、批量添加时出现界面卡顿或布局异常。
                QTimer::singleShot(0, this, [=]{addSongItem(songIW); });
            }
        }
    }

    QString htmlText = "<span style='font-family:Microsoft YaHei; font-size:33px; font-weight:bold; color: rgb(40, 50, 72);'>本地音乐</span>  "
                       "<span style='font-family:Microsoft YaHei; font-size:18px; font-weight:300 ; color:#9ca3af;'>共 " + QString::number(_songItems.size()) +" 首</span>";
    ui->label_listName->setText(htmlText);
    ui->label_listName->setTextFormat(Qt::RichText);  // 确保是富文本模式
}
